package game.database.mysql;

import dou.database.ConnectionPool;
import dou.database.DatabaseUtils;
import dou.database.QueryResult;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import java.sql.SQLException;

/**
 * Mysql 查询类
 * @author wizardc
 */
public class MysqlUtils
{
    private static Logger logger = LogManager.getLogger("GameServer");

    // 记录用于连接数据库的连接池对象
    private static ConnectionPool _pool;

    /**
     * 创建和数据库的连接
     * @param poolSize 数据库连接池大小
     * @throws ClassNotFoundException 当加载的驱动程序类不存在时抛出该异常
     * @throws SQLException 当初始化连接池失败时抛出该异常
     */
    public static void CreateConnection(int poolSize) throws ClassNotFoundException, SQLException
    {
        if(_pool == null)
        {
            _pool = new ConnectionPool(new MysqlConfig(), poolSize);
        }
    }

    /**
     * 执行会返回结果的查询数据库操作
     * @param sql 需要执行的 SQL 语句
     * @return 查询结果
     */
    public static QueryResult executeQuery(String sql)
    {
        try
        {
            logger.debug("Query SQL: " + sql);
            return DatabaseUtils.executeQuery(_pool, sql);
        }
        catch(InterruptedException exception)
        {
            logger.error("Query SQL error: ", exception);
        }
        catch(SQLException exception)
        {
            logger.error("Query SQL error: ", exception);
        }
        return null;
    }

    /**
     * 执行不需要返回结果的数据库查询操作
     * @param sql 需要执行的 SQL 语句
     */
    public static void executeSQL(String sql)
    {
        try
        {
            logger.debug("Execute SQL: " + sql);
            DatabaseUtils.executeSQL(_pool, sql);
        }
        catch(InterruptedException exception)
        {
            logger.error("Query SQL error: ", exception);
        }
        catch(SQLException exception)
        {
            logger.error("Query SQL error: ", exception);
        }
    }

    /**
     * 关闭所有的数据库连接
     * @throws SQLException 关闭出现异常时抛出该异常
     */
    public static void closeAllConnection()
    {
        if(_pool != null)
        {
            try
            {
                _pool.cleanup();
            }
            catch(SQLException exception)
            {
                logger.error("Close all connection error: ", exception);
            }
        }
    }
}
